package models.sala;

import java.net.Socket;
import java.util.Collection;
import java.util.HashMap;
import java.util.Map;

import models.Jogador;

public class Sistema {

	protected Map<String, Sala> salas = new HashMap<String, Sala>();
	protected Map<Integer, Jogador> jogadores = new HashMap<Integer, Jogador>();

	public boolean criarSala(String nomeSala, int qtdMax, Jogador lider){

		boolean jaExiste = false;

		//Percorrer a lista de salas para verificar se o nome já existe, se o lider já tem uma sala criada naquele momento e se a
		//quantidade maxima de jogadores está entre o que é pedido.
		for (Sala sala : salas.values()) {
			if (sala.nome.equals(nomeSala) || sala.lider == lider || qtdMax < 1 || qtdMax > 4){
				jaExiste = true;
				break;
			}
		}

		//Se não existe, ele cria a sala e adiciona ela na lista de salas.
		if (!jaExiste) {
			Sala s = new Sala(nomeSala, qtdMax, lider);

			salas.put(nomeSala, s);
			return true;
		}

		return false;
	}

	public Collection<Sala> verSala(){

		return salas.values();

	}

	public boolean entrarSala(String nomeSala, Jogador jogador){

		if(jogadorEmSala(jogador) == false){
			Sala sala = buscarSala(nomeSala);
			if (sala != null) {
				return sala.addJogador(jogador);
			}
		}
		return false;

	}

	protected boolean jogadorEmSala(Jogador jogador) {
		for(Sala s: salas.values()){
			for (Jogador j: s.jogadores){
				if(j.email.equals(jogador.email)){
					return true;
				}
			}
		}

		return false;
	}

	public Sala buscarSala(String nome){

		return salas.get(nome);
	}

	public Sala sairSala(Jogador jogador) {

		Sala sala = buscarSalaDoJogador(jogador);
		if (sala != null) {
			try {
				sala.removerJogador(jogador);
			} catch (SalaFicouVaziaException e) {
				fecharSala(sala);
				//e.printStackTrace();
			}
		}
		return sala;
	}

	protected Sala buscarSalaDoJogador(Jogador jogador) {
		for (Sala sala: salas.values()) {
			for (Jogador j: sala.jogadores) {
				if (j.email.equals(jogador.email)) {
					return sala;
				}
			}
		}
		return null;
	}

	private void fecharSala(Sala sala) {
		salas.remove(sala.nome);
	}

	public Jogador buscarJogador(int idJogador) {

		return jogadores.get(idJogador);
	}

	public void addJogador(Jogador jogador) {

		jogadores.put(jogador.idJogador, jogador);
	}
	
	public void removerJogador(Jogador jogador) {

		jogadores.remove(jogador.idJogador);
	}
	
	public void sair(Jogador jogador) {

		jogadores.remove(jogador);
		
	}
	
	public void registarNotificador(String idJogador, Socket cliente) {
		System.out.println("Buscando jogador com a identificacao ["+ idJogador +"].");
		Jogador jogador = jogadores.get(Integer.parseInt(idJogador));
		if (jogador != null) {
			System.out.println("Jogador "+ jogador.email +" foi registrado para notificação.");
			jogador.setSocketNotificador(cliente);
		} else {
			System.out.println("Jogador com indentificacao ["+ idJogador +"] não encontrado;");
		}
	}
}
